38. Object Composition

합성(Composition)
포함된 객체들을 모아서 이들을 포함한 다른 객체로 합성
레이어링(layering), 포함(containment), 통합(aggregation), 내장(embedding)
class Address{ /* ... */ };
class PhoneNumber{ /* ... */ };
class Person{
public:
// ...
private:
std::string name; //
Address address;
PhoneNumber voiceNumber;
PhoneNumber faxNumber;
};
객체 합성이 응용 영역(application domain)에서 일어날 경우, has-a
객체 합성이 시스템 구현 영역(implementation domain)에서 일어난 경우, is-implemented-in-terms-of
관계를 나타낸다.

위의 코드는 has-a 관계
template <typename T>
class Set: public std::list<T>{ /* ... */ };
단순 상속은 is-a 관계를 성립한다.
만일 list의 일부 구현만 사용하고 싶은 경우(is-implemented-in-terms-of 관계),
아래와 같이 합성으로 구현해 주어야 한다.
list를 이용하여 set 구현
set은 내부적으로 템플릿 원소 한 개당 3개의 포인터를 사용한다.
균형 탐색 트리(balanced search tree)로 구현되어 탐색 삭제 삽입 연산에서 시간 복잡도를 log로 만들기 위함
template <typename T>
class Set{
public:
bool member(const T& item) const;
void insert(const T& item);
void remove(const T& item);
std::size_t size() const;
private:
std::list<T> rep; // Set
};
template <typename T>
bool Set<T>::member(const T& item) const{
return std::find(rep.begin(), rep.end(), item)!=rep.end();
}
template <typename T>
void Set<T>::insert(const T& item){
if(!member(item))rep.push_back(item);
}
template <typename T>
void Set<T>::remove(const T& item){
typename std::list<T>::iterator it=std::find(rep.begin(), rep.end(), item);
if(it!=rep.end()) rep.erase(it);
}
template <typename T>
std::size_t Set<T>::size() const{
return rep.size();
}